#ifndef BUFFER_H_
#define BUFFER_H_

#include <list>
#include <stdexcept>


template<class T>
class Buffer {
private:
	unsigned int _tamMax;
	std::list<T> _lElementos;

public:
	Buffer(int tamMaximo) : _tamMax(tamMaximo){ }
	~Buffer(){ }


	int getCantElem() const {
		return this->_lElementos.size();
	}

	int getCantMax() const {
		return this->_tamMax;
	}


	bool agregarElem(T elem){
		// Esta lleno el buffer
		if (this->_lElementos.size() == this->_tamMax){
			return false;
		}

		this->_lElementos.push_back(elem);
		return true;
	}


	bool quitarElemento(T& elem){
		// Esta vacio el buffer
		if (this->_lElementos.size() == 0){
			return false;
		}

		elem = this->_lElementos.front();
		this->_lElementos.pop_front();

		return true;
	}

	// Devuelve una copia del elemento en la posicion señalada
	T verElemento(unsigned int pos) const {
		if (pos > this->_tamMax)
			throw std::range_error("No existe elemento en la posicion pedida");

		typename std::list<T>::const_iterator cit = this->_lElementos.begin();
		std::advance(cit, pos);

		return *cit;
	}
};


#endif /* BUFFER_H_ */
